(function () {
    "use strict";

    angular.module('core').controller('statePainelSyncFranchisingController', controller);
    controller.$inject = ['$scope', '$filter', '$interval', '$timeout', 'toolsService', 'servicoIntegracaoService'];

    function controller($scope, $filter, $interval, $timeout, toolsService, servicoIntegracaoService) {
        $scope.initializeLayout('Integração de Lojas');

        $scope.state = {
            loja: {
                data: [],
                filtro: {
                    args: {
                        chaves: null,
                        filtro: {
                            Ativo: true,
                        },
                    },
                },
                selecionado: null,
            },
            servico: {
                data: [],
                filtro: {
                    args: {
                        chaves: null,
                        filtro: {
                            Ativo: true,
                        },
                    },
                },
                carregando: false,
                vazio: false,
                count: 0,
                selecionado: null,
            },
        };
        $scope.auxiliar = {
            horas: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
            minutos: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
            frequencias: [{ id: 0, nome: 'Intervalo' }, { id: 1, nome: 'Lista de determinadas horas do dia' }],
        };
        $scope.timer = {
            segundos: 20,
            corrente: 0,
        };
        $scope.charts = {
            eventoIntegracaoPorDia: { carregando: false, vazio: false, },
        }

        var promise

        /* funções */
        $scope.initialize = function () {
            $scope.clearLoja();
            $scope.refresh();

            var promise = $interval(function () {
                if ($scope.timer.corrente == 0)
                    $scope.timer.corrente = $scope.timer.segundos;

                if ($scope.timer.corrente == $scope.timer.segundos)
                    $scope.refresh();

                $scope.timer.corrente--;
            }, 1000);

        };

        $scope.refresh = function () {
            if (!$scope.state.loja.selecionado)
                $scope.getAllLoja();
            else
                $scope.getAllServicoIntegracao();
        };

        $scope.getAllLoja = function () {
            servicoIntegracaoService
                .getAllLoja($scope.state.loja.filtro.args)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        angular.copy(angular.fromJson(response.Data), $scope.state.loja.data);
                    }
                },
                function (_error) {
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getServicoIntegracao = function () {
            servicoIntegracaoService
                .get($scope.state.servico.selecionado.item.ID)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        $scope.state.servico.selecionado.item = response.Data;
                        $scope.getAllEventoIntegracao();
                    }
                },
                function (_error) {
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getAllServicoIntegracao = function () {
            servicoIntegracaoService
                .getAll($scope.state.servico.filtro.args)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        angular.copy(angular.fromJson(response.Data), $scope.state.servico.data);
                    }
                    $scope.state.servico.carregando = false;
                    $scope.state.servico.vazio = ($scope.state.servico.data == 0);
                },
                function (_error) {
                    $scope.state.servico.carregando = false;
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getAllEventoIntegracao = function () {
            servicoIntegracaoService
                .getAllEventoIntegracao($scope.state.servico.selecionado.evento.filtro.args)
                .then(
                function (response) {

                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        angular.copy(angular.fromJson(response.Data), $scope.state.servico.selecionado.evento.data);
                    }
                },
                function (_error) {
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };
        $scope.getMoreEventoIntegracao = function () {
            $scope.state.evento.filtro.args.skip += $scope.state.evento.filtro.args.take;
            $scope.getAllEventoIntegracao();
        };
        $scope.saveServicoIntegracao = function (servicoIntegracao) {
            servicoIntegracaoService
                .save(servicoIntegracao)
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        var alteredIntegrationService = response.Data;
                        $scope.tools.toastr.success('Alterações realizadas com sucesso!');
                    }
                },
                function (_error) {
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };

        $scope.chartEventoIntegracaoPorDia = function () {
            $scope.charts.eventoIntegracaoPorDia.carregando = true;
            $scope.charts.eventoIntegracaoPorDia.vazio = false;
            servicoIntegracaoService
                .chartEventoIntegracaoPorDia({ filtro: { ServicoIntegracao: { ID: $scope.state.servico.selecionado.item.ID } } })
                .then(
                function (response) {
                    if (response.Status < 0) {
                        $scope.tools.toastr.error(response.Message, 'Serviço');
                        console.error(response.Exception);
                    } else {
                        $timeout(function () {
                            $scope.charts.eventoIntegracaoPorDia.vazio =
                                toolsService.buildChart("#chart-evento-integracao-por-dia", "Registros", response.Data);
                        });
                    }
                    $scope.charts.eventoIntegracaoPorDia.carregando = false;
                },
                function (_error) {
                    $scope.charts.eventoIntegracaoPorDia.carregando = false;
                    $scope.tools.toastr.error('Não foi possível conectar com o(s) servidor(es)');
                    console.error(_error);
                }
                );
        };


        $scope.selectLoja = function (loja) {
            $scope.state.loja.selecionado = loja;
            $scope.clearServico();
            $scope.state.servico.filtro.args.filtro.Origem.Codigo = loja.Codigo;
            $scope.getAllServicoIntegracao();
        }
        $scope.clearLoja = function () {
            $scope.state.loja.selecionado = null;
            $scope.state.servico.filtro.args = {
                chaves: null,
                filtro: {
                    Origem: {
                        Codigo: null
                    },
                },
                direcoes: [2, 3], //Core_para_Loja e Loja_para_Core
                sortExpression: null,
                skip: 0,
                take: 1000,
            },

                $scope.clearServico();
        };

        $scope.selectServico = function (id) {
            $scope.clearServico();
            $scope.state.servico.selecionado.item = { ID: id };
            $scope.state.servico.selecionado.evento.filtro.args.servicoIntegracaoID = id;
            $scope.getServicoIntegracao();
            $scope.chartEventoIntegracaoPorDia();
        };
        $scope.clearServico = function () {
            $scope.state.servico.selecionado = {
                item: null,
                tabCorrente: 0,
                evento: {
                    data: [],
                    filtro:
                    {
                        args: {
                            servicoIntegracaoID: null,
                            sortExpression: null,
                            skip: 0,
                            take: 20,
                        },
                    },
                    selecionado: null,
                },
            }
        };

        $scope.selectEvento = function (index) {
            $scope.state.servico.selecionado.evento.selecionado = $scope.state.servico.selecionado.evento.data[index];
        };
        $scope.clearEvento = function () {
            if ($scope.state.servico.selecionado.evento.selecionado)
                $scope.state.servico.selecionado.evento.selecionado = null;
        };

        $scope.clearFilter = function () {
            $scope.state.loja.filtro.args.filtro.Ativo = null;

            $scope.refresh();
        };
        $scope.toggleFilter = function () {
            $scope.state.loja.filtro.ativo = !$scope.state.loja.filtro.ativo;
        };

        $scope.initialize();
    }
})();